银行家算法的实现
-
实验目的
通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。
-
实验内容
1. 在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。
2. 创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。
3. 通过Win32 API提供的信号量机制,实现共享数据的并发访问。
-
实验思路
我们要理解银行家算法的整体思路,银行家算法是死锁避免的一种方法,在整个程序中,我们可以提供两种功能,首先我们可以判断当前系统是否处于安全状态,如果处于,则给出一条安全路径,否则提示用户。另外,我们提供进程的资源请求功能,当一个进程发出请求后,如果请求小于可用资源数量,那么请求通过,并进行安全算法的检验。
4.实验数据结构及说明
a为了表示程序的初始状态,我在这里用一组实例作为检测,在程序的开始,我们需要定义两个二维数组
Alloc表示五个进程已分配的资源,max表示最大的需求数量,max-alloc就是进程需要的资源数量
同时我们设一个系统可用资源数量的数组available
,表示三种资源可用的数量
b.main函数
Main函数中我们主要进行数据的显示及与用户的交互操作 ,当用户输入对应的进程号及相应的资源请求后,我们通过swich语句启动相应的进程函数,同时在函数中判断请求的资源是否小于可用的资源数,如果小于则判断是否存在安全路径,否则则输出请求资源大于可用资源。
C.5个线程函数
他们分别表示系统的5个进程,对资源进行请求,同时进行判断操作
D.ifsafe()函数是本实验的关键,用于判断系统是否处于安全状态,如果安全,则给出一条安全路径,否则输出不存在安全算法
-
程序运行时的初值及运行结果
a.判断当前系统是否安全
当输入5后,判断当前系统是否处于安全状态
可以看出,系统当前是安全的,且安全路径为P1-P3-P0-P2-P4
b.P1请求资源555的情况
可以看出,会输出请求资源大于可用资源
c.P0请求020的资源
可以看出此时也符合系统安全的要求
d.P4请求330的资源
也符合我们预期的结果
-
实验体会
开始碰到这个实验的时候,以为这个实验很简单,但在做的过程中,感觉这个实验还是挺复杂的,特别是判断系统是否安全的算法,如果系统安全,则输出一条安全路径,这个算法我整整想了一个下午加晚上,而且刚写完后,错误百出,自己又不得不一步一步进行程序的调试,直到最后成功输出了程序的正确结果,不知不觉就写了三百行的代码,心里还是很有成就感的,同时通过这个实验,也进一步加深了我对C++的一些基本算法的理解。
-
源程序加注释
#include<iostream>
#include<process.h>
#include<Windows.h>
using namespace std;
//定义5个线程函数,分别表示5个进程对系统资源的请求
DWORD WINAPI pro0(PVOID pvPram);
DWORD WINAPI pro1(PVOID pvPram);
DWORD WINAPI pro2(PVOID pvPram);
DWORD WINAPI pro3(PVOID pvPram);
DWORD WINAPI pro4(PVOID pvPram);
//申明安全函数
void ifsafe();
int available[3] = { 3,3,2 }; //系统当前可用的资源数
//5个进程已分配的资源数
int alloc[5][3] = { {0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
};
//5个进程的最大资源数
int max[5][3] = { {7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}
};
int a, b, c, d; //用于用户的输入b,c,d表示进程的请求资源数
int main()
{
//以一定的格式输出当前的资源分配情况
cout<< "******************银行家算法**********************" << endl;
cout<< " All Max Nee" << endl;
cout<< "P0 " << alloc[0][0]<< alloc[0][1]<< alloc[0][2]<< " " << max[0][0]<< max[0][1]<< max[0][2]<< " "